﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using System.Data;

using QLTTAN.BLL;
using QLTTAN.DTO;
namespace QLTTAN.Form
{
    public partial class frmChiTietPhongThiXepLop : DevExpress.XtraEditors.XtraForm
    {

        ThiXepLopBLL TXL_BLL;
        CT_ThiXepLopBLL CT_TXL_BLL;
        PhongHocBLL PH_BLL;
        DeThiBLL DT_BLL;
        LoaiChuongTrinhBLL LCT_BLL;
        HocVienBLL HV_BLL;
        KhoaHocBLL KH_BLL;
        ThamSoBLL TS_BLL;

        public int MaKhoaHocSelected = -1;
        public int MaTXLSelected = -1;

        private DataTable dtHocVien;
        private DataTable dtHocVienTemp;

        List<int> lstMaHVInsert;
        List<int> lstMaHVDelete;

        int limit;

        public frmChiTietPhongThiXepLop()
        {
            InitializeComponent();
        }

        private void FillDataInLookUpEditPhongThi()
        {
            try
            {
                lookUpEditPhongThi.Properties.DataSource = PH_BLL.PhongHoc_Load();
                lookUpEditPhongThi.Properties.ValueMember = "MaPhong";
                lookUpEditPhongThi.Properties.DisplayMember = "TenPhong";
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message, "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void FillDataInLookUpEditDeThi()
        {
            try
            {
                lookUpEditDeThi.Properties.DataSource = DT_BLL.DeThi_Load();
                lookUpEditDeThi.Properties.ValueMember = "MaDeThi";
                lookUpEditDeThi.Properties.DisplayMember = "TenDeThi";
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message, "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void FillDataInLookUpEditChuongTrinhThi()
        {
            try
            {
                lookUpEditChuongTrinhThi.Properties.DataSource = LCT_BLL.LoaiChuongTrinh_Load();
                lookUpEditChuongTrinhThi.Properties.ValueMember = "MaLoaiCT";
                lookUpEditChuongTrinhThi.Properties.DisplayMember = "TenLoaiCT";
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message, "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void CreateDataTableHocVien()
        {
            dtHocVien = new DataTable();
            dtHocVien.Columns.Add("MaHV", typeof(int));
            dtHocVien.Columns.Add("TenHV", typeof(string));
            dtHocVien.Columns.Add("GioiTinh", typeof(int));
            dtHocVien.Columns.Add("NgaySinh", typeof(DateTime));
            dtHocVien.Columns.Add("DiaChi", typeof(string));

            gridCtrlHocVien.DataSource = dtHocVien;
        }

        private void CreateDataTableHocVienTemp(DataTable dt)
        {
            dtHocVienTemp = new DataTable();
            dtHocVienTemp.Columns.Add("MaHV", typeof(int));
            dtHocVienTemp.Columns.Add("TenHV", typeof(string));
            dtHocVienTemp.Columns.Add("GioiTinh", typeof(int));
            dtHocVienTemp.Columns.Add("NgaySinh", typeof(DateTime));
            dtHocVienTemp.Columns.Add("DiaChi", typeof(string));

            dtHocVienTemp = dt.Copy();
        }

        private void SetEnableControl(bool isEnable)
        {
            dateNgayThi.Enabled = isEnable;
            timeThoiGianThi.Enabled = isEnable;
            lookUpEditDeThi.Enabled = isEnable;
            lookUpEditPhongThi.Enabled = isEnable;
            lookUpEditChuongTrinhThi.Enabled = isEnable;
            Xoa.OptionsColumn.AllowEdit = isEnable;

            btnXuat.Enabled = !isEnable;
            btnSua.Enabled = !isEnable;
            btnLuu.Enabled = isEnable;
            btnThemHV.Enabled = isEnable;
        }

        private void frmChiTietPhongThiXepLop_Load(object sender, EventArgs e)
        {
            TXL_BLL = new ThiXepLopBLL();
            CT_TXL_BLL = new CT_ThiXepLopBLL();
            DT_BLL = new DeThiBLL();
            PH_BLL = new PhongHocBLL();
            LCT_BLL = new LoaiChuongTrinhBLL();
            HV_BLL = new HocVienBLL();
            KH_BLL = new KhoaHocBLL();
            TS_BLL = new ThamSoBLL();

            FillDataInLookUpEditPhongThi();
            FillDataInLookUpEditDeThi();
            FillDataInLookUpEditChuongTrinhThi();

            CreateDataTableHocVien();

            SetEnableControl(true);
            
            try
            {
                //Load số học viên tối đa của 1 phòng thi xếp lớp.
                limit = int.Parse(TS_BLL.ThamSo_Load().Rows[0][1].ToString());

                if (MaTXLSelected == -1)
                {
                    KhoaHocDTO KH_DTO = new KhoaHocDTO();
                    KH_DTO.MaKhoaHoc = MaKhoaHocSelected;
                    DataRow r = KH_BLL.KhoaHoc_GetInfo(KH_DTO);
                    txtKhoaHoc.Text = r["TenKhoaHoc"].ToString();
                }
                else // Trường hợp xem thông tin phòng thi => load lên thông tin phòng thi cần xem.
                {

                    SetEnableControl(false);

                    ThiXepLopDTO TXL_DTO = new ThiXepLopDTO();
                    TXL_DTO.MaTXL = MaTXLSelected;

                    // Load thông tin phòng thi.
                    DataRow TXLSelected = TXL_BLL.ThiXepLop_GetInfo(TXL_DTO);
                    dateNgayThi.EditValue = TXLSelected["NgayThi"];
                    lookUpEditPhongThi.ItemIndex = lookUpEditPhongThi.Properties.GetDataSourceRowIndex("MaPhong", TXLSelected["MaPhong"]);
                    timeThoiGianThi.EditValue = (TimeSpan)TXLSelected["ThoiGianThi"];
                    txtKhoaHoc.Text = TXLSelected["TenKhoaHoc"].ToString();
                    txtSiSo.Text = TXLSelected["SiSo"].ToString();
                    txtKhoaHoc.Text = TXLSelected["TenKhoaHoc"].ToString();
                    lookUpEditChuongTrinhThi.ItemIndex = lookUpEditChuongTrinhThi.Properties.GetDataSourceRowIndex("MaLoaiCT", TXLSelected["MaLoaiCT"]);
                    lookUpEditDeThi.ItemIndex = lookUpEditDeThi.Properties.GetDataSourceRowIndex("MaDeThi", TXLSelected["MaDeThi"]);

                    // Load danh sách học viên.
                    CT_ThiXepLopDTO CT_TXL_DTO = new CT_ThiXepLopDTO();
                    CT_TXL_DTO.MaTXL = MaTXLSelected;

                    dtHocVien = CT_TXL_BLL.CT_ThiXepLop_Load(CT_TXL_DTO);
                    gridCtrlHocVien.DataSource = dtHocVien;
                    CreateDataTableHocVienTemp(dtHocVien);

                    lstMaHVInsert = new List<int>();
                    lstMaHVDelete = new List<int>();
                }
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message, "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnXuat_Click(object sender, EventArgs e)
        {

        }

        private void btnSua_Click(object sender, EventArgs e)
        {
            SetEnableControl(true);
            btnLuu.Enabled = true;
        }

        private void btnThemHV_Click(object sender, EventArgs e)
        {
            frmTimKiemHocVien frmTKHV = new frmTimKiemHocVien();
            frmTKHV.isEnablebtnChonHV = true;
            frmTKHV.isTinhTrang = false;
            frmTKHV.isMultiSelectGrid = true;
            frmTKHV.ShowDialog();

            List<int> lstMaHV = new List<int>();
            lstMaHV = frmTKHV.lstMaHVSelected;

            // Nếu có học viên đc chọn.
            try
            {
                if (lstMaHV.Count > 0)
                {
                    HocVienDTO HV_DTO = new HocVienDTO();

                    int remain = limit - gridViewHocVien.RowCount;

                    int count = 0;
                    foreach (var i in lstMaHV)
                    {
                        if (count >= remain)
                        {
                            XtraMessageBox.Show("Đã đủ số lượng sinh viên cho 1 phòng thi xếp lớp", "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            break;
                        }

                        if (!CheckExistInGridHocVien(i))
                        {
                            HV_DTO.MaHV = i;
                            DataRow row = HV_BLL.HocVien_GetInfo(HV_DTO);

                            dtHocVien.Rows.Add(row["MaHV"], row["TenHV"], row["GioiTinh"], row["NgaySinh"], row["DiaChi"]);

                            if (MaTXLSelected != -1)
                            {
                                int MaHocVienInsert = int.Parse(row["MaHV"].ToString());

                                if (lstMaHVDelete.Contains(MaHocVienInsert))
                                    lstMaHVDelete.Remove(MaHocVienInsert);

                                foreach (DataRow r in dtHocVienTemp.Rows)
                                {
                                    if (int.Parse(r["MaHV"].ToString()) == i)
                                        return;
                                }

                                if (!lstMaHVInsert.Contains(MaHocVienInsert))
                                    lstMaHVInsert.Add(MaHocVienInsert);

                            }

                            count++;
                        }
                    }

                    txtSiSo.Text = dtHocVien.Rows.Count.ToString();
                } 
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message, "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }        
        }

        private bool CheckExistInGridHocVien(int maHV)
        {
            foreach (DataRow r in dtHocVien.Rows)
            {
                if (int.Parse(r["MaHV"].ToString()) == maHV)
                    return true;
            }

            return false;
        }


        private void btnLuu_Click(object sender, EventArgs e)
        {
            string error = "";
            if (dateNgayThi.Text.Trim().Equals(""))
            {
                error += "Bạn chưa chọn ngày thi. \r\n";
            }
            if (lookUpEditPhongThi.EditValue == null)
            {
                error += "Bạn chưa chọn phòng thi. \r\n";
            }
            if(timeThoiGianThi.EditValue == null)
            {
                error += "Bạn chưa chọn thời gian thi. \r\n";
            }
            if (lookUpEditChuongTrinhThi.EditValue == null)
            {
                error += "Bạn chưa chọn chương trình thi. \r\n";
            }
            if (lookUpEditDeThi.EditValue == null)
            {
                error += "Bạn chưa chọn đề thi. \r\n";
            }

            // Load Số hv tối đa trong 1 phòng thi xếp lớp từ bảng tham số.
            int SoHVToiDa = 20;
            if(gridViewHocVien.RowCount > SoHVToiDa)
            {
                error += "Số học viên lớn hơn số học viên cho phép.\nSố học viên tối đa là " + SoHVToiDa.ToString()+".\r\n";
            }
            
            if (!error.Equals(""))
            {
                XtraMessageBox.Show(error, "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            ThiXepLopDTO TXL_DTO = new ThiXepLopDTO();
            TXL_DTO.MaPhong = int.Parse(lookUpEditPhongThi.EditValue.ToString());
            TXL_DTO.MaDeThi = int.Parse(lookUpEditDeThi.EditValue.ToString());
            TXL_DTO.MaLoaiCT = int.Parse(lookUpEditChuongTrinhThi.EditValue.ToString());
            TXL_DTO.NgayThi = (DateTime)dateNgayThi.EditValue;
            if (timeThoiGianThi.EditValue is DateTime)
                TXL_DTO.ThoiGianThi = ((DateTime)timeThoiGianThi.EditValue).TimeOfDay;
            if (timeThoiGianThi.EditValue is TimeSpan)
                TXL_DTO.ThoiGianThi = (TimeSpan)timeThoiGianThi.EditValue;
            
            try
            {
                // Thêm Phòng Thi.
                if (MaTXLSelected == -1)
                {
                    TXL_DTO.MaKhoaHoc = MaKhoaHocSelected;

                    if (TXL_BLL.ThiXepLop_Insert(TXL_DTO) > 0)
                    {
                        CT_ThiXepLopDTO CT_TXL_DTO = new CT_ThiXepLopDTO();
                        CT_TXL_DTO.MaTXL = int.Parse(TXL_BLL.ThiXepLop_GetLastID()[0].ToString());

                        for (int i = 0; i < gridViewHocVien.RowCount; i++)
                        {
                            CT_TXL_DTO.MaHV = int.Parse(gridViewHocVien.GetDataRow(i)["MaHV"].ToString());
                            CT_TXL_BLL.CT_ThiXepLop_Insert(CT_TXL_DTO);
                        }

                        if (XtraMessageBox.Show("Lưu dữ liệu thành công.", "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK)
                            this.Close();
                    }

                    else
                        XtraMessageBox.Show("Lưu dữ liệu thất bại.", "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    // Sửa Phòng Thi.

                    TXL_DTO.MaTXL = MaTXLSelected;

                    if (TXL_BLL.ThiXepLop_Update(TXL_DTO) > 0)
                    {

                        CT_ThiXepLopDTO CT_TXL_DTO = new CT_ThiXepLopDTO();
                        CT_TXL_DTO.MaTXL = MaTXLSelected;

                        foreach (int item in lstMaHVInsert)
                        {
                            CT_TXL_DTO.MaHV = item;

                            CT_TXL_BLL.CT_ThiXepLop_Insert(CT_TXL_DTO);
                        }

                        foreach (int item in lstMaHVDelete)
                        {
                            CT_TXL_DTO.MaHV = item;

                            CT_TXL_BLL.CT_ThiXepLop_Delete(CT_TXL_DTO);
                        }

                        if (XtraMessageBox.Show("Lưu dữ liệu thành công.", "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK)
                            this.Close();
                    }
                    else
                        XtraMessageBox.Show("Lưu dữ liệu thất bại.", "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message, "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
        }

        private void btnThoat_Click(object sender, EventArgs e)
        {
            if (XtraMessageBox.Show("Bạn có chắc chắn muốn thoát khỏi màn hình Chi Tiết Phòng Thi Xếp Lớp?\n Mọi thao tác của bạn sẽ không được lưu lại.",
                                   "Thông báo!!!", MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.OK)
                this.Close();
        }

        private void lookUpEditDeThi_EditValueChanged(object sender, EventArgs e)
        {
            DevExpress.XtraEditors.LookUpEdit editor = (sender as DevExpress.XtraEditors.LookUpEdit);
            DataRowView row = editor.Properties.GetDataSourceRowByKeyValue(editor.EditValue) as DataRowView;
            if (row != null)
                txtThoiLuongThi.Text = row["ThoiLuongThi"].ToString();
        }

        private void repositoryItemButtonEditXoa_Click(object sender, EventArgs e)
        {
            if (MaTXLSelected != -1)
            {
                int MaHVDelete = int.Parse(gridViewHocVien.GetDataRow(gridViewHocVien.FocusedRowHandle)["MaHV"].ToString());

                if (!lstMaHVDelete.Contains(MaHVDelete))
                    lstMaHVDelete.Add(MaHVDelete);

                if (lstMaHVInsert.Contains(MaHVDelete))
                    lstMaHVInsert.Remove(MaHVDelete);
            }

            dtHocVien.Rows.Remove(gridViewHocVien.GetDataRow(gridViewHocVien.FocusedRowHandle));
            txtSiSo.Text = dtHocVien.Rows.Count.ToString();

            //gridCtrlHocVien.DataSource = dtHocVien;
        }

        private void gridViewHocVien_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
        {
            if (e.Column.FieldName == "STT")
                e.DisplayText = (e.ListSourceRowIndex + 1).ToString();

            if (e.Column == GioiTinh)
            {
                e.DisplayText = (Convert.ToBoolean(e.Value)) == true ? "Nam" : "Nữ";
            }
        }
    }
}